package angryballsDecorateur.modele.bases;

import java.awt.Color;
import java.util.Observable;
import java.util.Vector;

import mesmaths.cinematique.Cinematique;
import mesmaths.geometrie.base.Geop;
import mesmaths.geometrie.base.Vecteur;
import angryballsDecorateur.visitor.BilleVisitor;
import exodecorateur_angryballs.maladroit.modele.OutilsBille;

public class BilleDecore extends Observable implements BilleDecorable {

	private static int prochaineClef = 0;
	public static double ro = 1;

	public Vecteur position;
	public double rayon;
	public Vecteur vitesse;
	public Vecteur accélération;
	public int clef;
	private Color couleur;

	protected BilleDecore(Vecteur centre, double rayon, Vecteur vitesse,
			Vecteur accélération, Color couleur) {
		this.position = centre;
		this.rayon = rayon;
		this.vitesse = vitesse;
		this.accélération = accélération;
		this.couleur = couleur;
		this.clef = BilleDecore.prochaineClef++;
	}

	public BilleDecore(Vecteur position, double rayon, Vecteur vitesse,
			Color couleur) {
		this(position, rayon, vitesse, new Vecteur(), couleur);
	}

	@Override
	public Vecteur getPosition() {
		return this.position;
	}

	@Override
	public double getRayon() {
		return this.rayon;
	}

	@Override
	public Vecteur getVitesse() {
		return this.vitesse;
	}

	@Override
	public Vecteur getAccélération() {
		return this.accélération;
	}

	@Override
	public int getClef() {
		return this.clef;
	}

	@Override
	public double masse() {
		return ro * Geop.volumeSphère(rayon);
	}

	@Override
	public void déplacer(double deltaT) {
		Cinematique.mouvementUniformémentAccéléré(this.getPosition(),
				this.getVitesse(), this.getAccélération(), deltaT);
	}

	@Override
	public boolean gestionCollisionBilleBille(Vector<BilleDecorable> billes) {
		if (OutilsBille.gestionCollisionBilleBille(this, billes)) {
			triggerCollisionEvent();
			return true;
		}
		return false;
	}

	@Override
	public Color getColor() {
		return couleur;
	}

	@Override
	public String toString() {
		return "centre = " + position + " rayon = " + rayon + " vitesse = "
				+ vitesse + " accélération = " + accélération + " couleur = "
				+ couleur + "clef = " + clef;
	}

	@Override
	public void collisionContour(double abscisseCoinHautGauche,
			double ordonnéeCoinHautGauche, double largeur, double hauteur) {
		// Par défaut, il n'y a pas de gestion des collisions
		// Il faut utiliser un décorateur pour implémenter une gestion des
		// collisions
	}

	@Override
	public void gestionAccélération(Vector<BilleDecorable> billes) {
		// Par défaut, il n'y a pas d'acceleration
		// Il faut utiliser un décorateur pour gérer l'accélération
		this.getAccélération().set(Vecteur.VECTEURNUL);
	}

	@Override
	public void accept(BilleVisitor visitor) {
		visitor.visit(this);
	}

	@Override
	public void triggerCollisionEvent() {
		setChanged();
		notifyObservers();
	}
}
